// 1.时间戳写法 
// 立即执行 最后一次高频操作可能不被执行

function throttle(fn, interval) {
  let last = 0;
  return function () {
    let now = Date.now()

    if (now - last >= interval) {
      fn.apply(this, arguments)
      last = now
    }
  }
}

// 2.SetTimeout写法 
// 延迟执行 最后一次触发事件 由于延迟 也还是会执行最后一个定时器

function throttle(fn, interval) {
  let timer = null;

  return function (...args) {
    if (!timer) {
      timer = setTimeout(() => {
        fn.apply(this, args)
        timer = null
      }, interval)
    }
  }
}


// 3.时间戳 setTimeout结合写法
// 第一次触发事件时马上执行事件处理函数 最后一次触发事件后也还会执行一次事件处理函数

function throttle(fn, delay) {
  let timer = null;
  let startTime = Date.now()

  return function () {
    let currTime = Date.now()
    let remaining = delay - (currTime - startTime)
    clearTimeout(timer)
    if (remaining <= 0) {
      fn.apply(this, arguments)
      startTime = Date.now()
    } else {
      timer = setTimeout(fn, remaining)
    }
  }
}


// function handle() {
//   console.log(~~(Math.random() * 100));
// }

// const throttleHandle = throttle(handle, 1000)

// throttleHandle(1, 2, 3)
// throttleHandle()
// throttleHandle()
// throttleHandle()
// throttleHandle()
// throttleHandle()